Add debugging flag for domains to make domu debugging a run-time option
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Thu, 15 Dec 2005 20:50:12 +0000 (21:50 +0100)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Thu, 15 Dec 2005 20:50:12 +0000 (21:50 +0100)
Signed-off-by: Kip Macy kmacy@fsmware.ckm
tools/debugger/gdb/gdb-6.2.1-xen-sparse/gdb/gdbserver/linux-xen-low.c
tools/libxc/xc_ptrace.c
xen/Rules.mk
xen/common/dom0_ops.c
xen/include/asm-x86/debugger.h
xen/include/public/dom0_ops.h
xen/include/xen/sched.h

index 02d39ed6219735319c5c75068541cd85236907d2..786d0dcd0ca104e06b4314b4e7909f434b0aea22 100644 (file)
@@ -231,11 +231,6 @@ linux_wait (char *status)
   if (myxcwait(xc_handle, current_domid, &w, 0))
       return -1;
   
-  if (w & (DOMFLAGS_SHUTDOWN|DOMFLAGS_DYING)) {
-      *status = 'W';
-      return 0;
-  }
-
   linux_set_inferior();
 
   *status = 'T';
index 11515011be22f4b45995944c869fd10fa1c4c1c0..0bf365a314ccf805b0adf6ab6ba85588f86ed06c 100644 (file)
@@ -345,8 +345,6 @@ xc_ptrace(
     void           *addr = (char *)eaddr;
     void           *data = (char *)edata;
 
-    op.interface_version = DOM0_INTERFACE_VERSION;
-
     cpu = (request != PTRACE_ATTACH) ? domid_tid : 0;
     
     switch ( request )
@@ -434,6 +432,13 @@ xc_ptrace(
                 }
             }
         }
+        if ( request == PTRACE_DETACH )
+        {
+            op.cmd = DOM0_SETDEBUGGING;
+            op.u.setdebugging.domain = current_domid;
+            op.u.setdebugging.enable = 0;
+            retval = do_dom0_op(xc_handle, &op);
+        }
         regs_valid = 0;
         xc_domain_unpause(xc_handle, current_domid > 0 ? current_domid : -current_domid);
         break;
@@ -453,10 +458,15 @@ xc_ptrace(
             printf("domain currently paused\n");
         } else
             retval = xc_domain_pause(xc_handle, current_domid);
-    if (get_online_cpumap(xc_handle, &op.u.getdomaininfo, &cpumap))
-        printf("get_online_cpumap failed\n");
-    if (online_cpumap != cpumap)
-        online_vcpus_changed(cpumap);
+        op.cmd = DOM0_SETDEBUGGING;
+        op.u.setdebugging.domain = current_domid;
+        op.u.setdebugging.enable = 1;
+        retval = do_dom0_op(xc_handle, &op);
+
+        if (get_online_cpumap(xc_handle, &op.u.getdomaininfo, &cpumap))
+            printf("get_online_cpumap failed\n");
+        if (online_cpumap != cpumap)
+            online_vcpus_changed(cpumap);
         break;
 
     case PTRACE_SETFPREGS:
index f9721f03a2d1b4a206d2e800b517e9d527a110b1..276659053a414cd3594d8c374321599bd4483a13 100644 (file)
@@ -6,7 +6,6 @@ verbose     ?= n
 debug       ?= n
 perfc       ?= n
 perfc_arrays?= n
-domu_debug  ?= n
 crash_debug ?= n
 
 XEN_ROOT=$(BASEDIR)/..
@@ -54,10 +53,6 @@ else
 CFLAGS += -g -DVERBOSE
 endif
 
-ifeq ($(domu_debug),y)
-CFLAGS += -DDOMU_DEBUG
-endif
-
 ifeq ($(crash_debug),y)
 CFLAGS += -g -DCRASH_DEBUG
 endif
index c479e5efa45a192e86431f044a7f0bfa5bbfc47a..1505dc782dff7370656970abcb51299e52aaf69f 100644 (file)
@@ -577,6 +577,22 @@ long do_dom0_op(dom0_op_t *u_dom0_op)
         }
     }
     break;
+    case DOM0_SETDEBUGGING:
+    {
+        struct domain *d; 
+        ret = -ESRCH;
+        d = find_domain_by_id(op->u.setdebugging.domain);
+        if ( d != NULL )
+        {
+            if ( op->u.setdebugging.enable )
+                set_bit(_DOMF_debugging, &d->domain_flags);
+            else
+                clear_bit(_DOMF_debugging, &d->domain_flags);
+            put_domain(d);
+            ret = 0;
+        }
+    }
+    break;
 
 #ifdef PERF_COUNTERS
     case DOM0_PERFCCONTROL:
index aa2050f849e27d83b36e677774ed6e8b30ccee8d..241c12d1f89b650c7985ce69c67cd9a10cbf7fec 100644 (file)
@@ -30,6 +30,8 @@
 #ifndef __X86_DEBUGGER_H__
 #define __X86_DEBUGGER_H__
 
+#include <xen/sched.h>
+#include <asm/regs.h>
 #include <asm/processor.h>
 
 /* The main trap handlers use these helper macros which include early bail. */
 #if defined(CRASH_DEBUG)
 
 extern int __trap_to_cdb(struct cpu_user_regs *r);
-#define debugger_trap_entry(_v, _r) (0)
 
-static inline int debugger_trap_fatal(
+#define __debugger_trap_entry(_v, _r) (0)
+
+static inline int __debugger_trap_fatal(
     unsigned int vector, struct cpu_user_regs *regs)
 {
     (void)__trap_to_cdb(regs);
@@ -51,60 +54,52 @@ static inline int debugger_trap_fatal(
 }
 
 /* Int3 is a trivial way to gather cpu_user_regs context. */
-#define debugger_trap_immediate() __asm__ __volatile__ ( "int3" );
-
-#elif defined(DOMU_DEBUG)
-
-#include <xen/sched.h>
-#include <asm/regs.h>
-
-static inline int debugger_trap_entry(
-    unsigned int vector, struct cpu_user_regs *regs)
-{
-    struct vcpu *v = current;
-
-    if ( !KERNEL_MODE(v, regs) || (v->domain->domain_id == 0) )
-        return 0;
-    
-    switch ( vector )
-    {
-    case TRAP_int3:
-    case TRAP_debug:
-        domain_pause_for_debugger();
-        return 1;
-    }
-
-    return 0;
-}
-
-#define debugger_trap_fatal(_v, _r) (0)
-#define debugger_trap_immediate()
+#define __debugger_trap_immediate() __asm__ __volatile__ ( "int3" );
 
 #elif 0
 
 extern int kdb_trap(int, int, struct cpu_user_regs *);
 
-static inline int debugger_trap_entry(
+static inline int __debugger_trap_entry(
     unsigned int vector, struct cpu_user_regs *regs)
 {
     return 0;
 }
 
-static inline int debugger_trap_fatal(
+static inline int __debugger_trap_fatal(
     unsigned int vector, struct cpu_user_regs *regs)
 {
     return kdb_trap(vector, 0, regs);
 }
 
 /* Int3 is a trivial way to gather cpu_user_regs context. */
-#define debugger_trap_immediate() __asm__ __volatile__ ( "int3" );
+#define __debugger_trap_immediate() __asm__ __volatile__ ( "int3" )
 
 #else
 
-#define debugger_trap_entry(_v, _r) (0)
-#define debugger_trap_fatal(_v, _r) (0)
-#define debugger_trap_immediate()
+#define __debugger_trap_entry(_v, _r) (0)
+#define __debugger_trap_fatal(_v, _r) (0)
+#define __debugger_trap_immediate()   ((void)0)
 
 #endif
 
+static inline int debugger_trap_entry(
+    unsigned int vector, struct cpu_user_regs *regs)
+{
+    struct vcpu *v = current;
+
+    if ( KERNEL_MODE(v, regs) &&
+         test_bit(_DOMF_debugging, &v->domain->domain_flags) &&
+         ((vector == TRAP_int3) || (vector == TRAP_debug)) )
+    {
+        domain_pause_for_debugger();
+        return 1;
+    }
+
+    return __debugger_trap_entry(vector, regs);
+}
+
+#define debugger_trap_fatal(v, r) (__debugger_trap_fatal(v, r))
+#define debugger_trap_immediate() (__debugger_trap_immediate())
+
 #endif /* __X86_DEBUGGER_H__ */
index cf40e39c3e1ecde22e78a88378f6a3689b51296a..b6b5914200c02c2a7f0f44aa3559e5a4e940650a 100644 (file)
@@ -404,6 +404,12 @@ typedef struct {
     xen_domain_handle_t handle;
 } dom0_setdomainhandle_t;
 
+#define DOM0_SETDEBUGGING 45
+typedef struct {
+    domid_t domain;
+    uint8_t enable;
+} dom0_setdebugging_t;
+
 typedef struct {
     uint32_t cmd;
     uint32_t interface_version; /* DOM0_INTERFACE_VERSION */
@@ -440,7 +446,8 @@ typedef struct {
         dom0_platform_quirk_t    platform_quirk;
         dom0_physical_memory_map_t physical_memory_map;
         dom0_max_vcpus_t         max_vcpus;
-        dom0_setdomainhandle_t   setdomainhandle;
+        dom0_setdomainhandle_t   setdomainhandle;        
+        dom0_setdebugging_t      setdebugging;
         uint8_t                  pad[128];
     } u;
 } dom0_op_t;
index ef7bd9190f2291754357700a8aab36355cf2dc2b..80d17a5e247f5f47c17dddf94acdc3c2e9438acc 100644 (file)
@@ -393,6 +393,10 @@ extern struct domain *domain_list;
  /* Domain is paused by controller software. */
 #define _DOMF_ctrl_pause       6
 #define DOMF_ctrl_pause        (1UL<<_DOMF_ctrl_pause)
+ /* Domain is being debugged by controller software. */
+#define _DOMF_debugging        7
+#define DOMF_debugging         (1UL<<_DOMF_debugging)
+
 
 static inline int domain_runnable(struct vcpu *v)
 {